/******************************************************************************
 * $Id$
 *
 * Project:  APP ENVISAT Support
 * Purpose:  Low Level Envisat file access (read/write) API.
 * Author:   Frank Warmerdam, warmerdam@pobox.com
 *
 ******************************************************************************
 * Copyright (c) 2001, Atlantis Scientific, Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 ****************************************************************************/

#ifndef ENVISAT_FILE_H_
#define ENVISAT_FILE_H_

typedef struct EnvisatFile_tag EnvisatFile;

typedef enum
{
    MPH = 0,
    SPH = 1
} EnvisatFile_HeaderFlag;

int EnvisatFile_Open( EnvisatFile **self, const char *filename,
                      const char *mode );
void EnvisatFile_Close( EnvisatFile *self );
const char *EnvisatFile_GetFilename( EnvisatFile *self );
int EnvisatFile_Create( EnvisatFile **self, const char *filename,
                        const char *template_file );
int EnvisatFile_GetCurrentLength( EnvisatFile *self );

const char* EnvisatFile_GetKeyByIndex(  EnvisatFile *self,
                                        EnvisatFile_HeaderFlag mph_or_sph,
                                        int key_index );

int EnvisatFile_TestKey(  EnvisatFile *self,
                          EnvisatFile_HeaderFlag mph_or_sph,
                          const char *key );

const char *EnvisatFile_GetKeyValueAsString( EnvisatFile *self,
                                             EnvisatFile_HeaderFlag mph_or_sph,
                                             const char *key,
                                             const char *default_value );

int EnvisatFile_SetKeyValueAsString( EnvisatFile *self,
                                     EnvisatFile_HeaderFlag mph_or_sph,
                                     const char *key,
                                     const char *value );

int EnvisatFile_GetKeyValueAsInt( EnvisatFile *self,
                                  EnvisatFile_HeaderFlag mph_or_sph,
                                  const char *key,
                                  int default_value );

int EnvisatFile_SetKeyValueAsInt( EnvisatFile *self,
                                  EnvisatFile_HeaderFlag mph_or_sph,
                                  const char *key,
                                  int value );

double EnvisatFile_GetKeyValueAsDouble( EnvisatFile *self,
                                        EnvisatFile_HeaderFlag mph_or_sph,
                                        const char *key,
                                        double default_value );
int EnvisatFile_SetKeyValueAsDouble( EnvisatFile *self,
                                     EnvisatFile_HeaderFlag mph_or_sph,
                                     const char *key,
                                     double value );

int EnvisatFile_GetDatasetIndex( EnvisatFile *self, const char *ds_name );

int EnvisatFile_GetDatasetInfo( EnvisatFile *self,
                                int ds_index,
                                const char **ds_name,
                                const char **ds_type,
                                const char **filename,
                                int  *ds_offset,
                                int  *ds_size,
                                int  *num_dsr,
                                int  *dsr_size );
int EnvisatFile_SetDatasetInfo( EnvisatFile *self,
                                int ds_index,
                                int ds_offset,
                                int ds_size,
                                int num_dsr,
                                int dsr_size );

int EnvisatFile_ReadDatasetRecordChunk( EnvisatFile *self,
                                    int ds_index,
                                    int record_index,
                                    void *buffer,
                                    int offset, int size ) ;
int EnvisatFile_ReadDatasetRecord( EnvisatFile *self,
                                   int ds_index,
                                   int record_index,
                                   void *record_buffer );
int EnvisatFile_WriteDatasetRecord( EnvisatFile *self,
                                    int ds_index,
                                    int record_index,
                                    void *record_buffer );
int EnvisatFile_ReadDatasetChunk( EnvisatFile *self,
                                  int ds_index,
                                  int offset,
                                  int size,
                                  void *buffer );

#ifndef FAILURE
#  define FAILURE 1
#endif
#ifndef SUCCESS
#  define SUCCESS 0
#endif

#endif /* ENVISAT_FILE_H_ */

/* EOF */
